package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 排序自定义类型元素的集合
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(1,2));
        list.add(new Point(9,8));
        list.add(new Point(3,4));
        list.add(new Point(12,7));
        list.add(new Point(5,6));
        list.add(new Point(0,2));
        System.out.println(list);
        /*
            Collections.sort(List list)该方法要求集合元素必须实现
            Comparable接口(可比较),然后其基于接口要求重写的比较方法来
            比较集合元素的大小从而完成排序.
            当我们在使用一个方法完成某个功能时,该方法要求我们为其修改其他
            地方的代码时,这个方法就对我们的代码具有了侵入性,这不利于程序
            后期的维护升级,应当尽量避免.
         */
//        Collections.sort(list);

        Comparator<Point> c = new Comparator<Point>() {
            /**
             * compare用于定义参数o1与参数o2的比较大小规则
             * 返回值用于表示o1与o2的大小关系:
             * 当返回值>0时,表示o1>o2
             * 当返回值<0时,表示o1<o2
             * 当返回值=0时,表示o1=o2
             */
            public int compare(Point o1, Point o2) {
                //比较大小的规则为点到原点的距离长的大
                //o1的长度
                int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
                //o2的长度
                int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
                return len1-len2;
            }
        };
        /*
            重载的sort方法要求我们传入一个比较器(为集合元素单独定义的
            一个比较规则),然后该方法会利用比较器中的compare方法将集合
            元素进行比较大小从而排序.
            此方法不再要求集合元素必须实现Comparable接口.
            因此,将来使用时只要sort(List list)不能使用的,都改为使用
            下面的sort方法
         */
        Collections.sort(list,c);


        /*
            没有侵入性的写法
         */
        Collections.sort(list,new Comparator<Point>() {
            public int compare(Point o1, Point o2) {
                int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
                int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
                return len1-len2;
            }
        });


        //lambda表达式形式创建比较器
        Collections.sort(
                list,
                (o1,o2)->o1.getX()*o1.getX()+o1.getY()*o1.getY()-
                        o2.getX()*o2.getX()-o2.getY()*o2.getY()
        );

        System.out.println(list);
    }
}
